package tankgame04;

import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Scanner;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * TankGame04
 * 完善功能
 * 02防止坦克重叠
 * 03记录玩家成绩
 * 选择继续上局游戏时，还原敌方坦克的状态
 * 04添加游戏开始音乐、背景音乐、射击音效、坦克爆炸音效，坦克大战的窗口标题
 * 处理当第一次运行游戏时选择继续游戏时的异常
 * 取消控制台上显示的子弹坐标
 * 在MyPanel的构造器中启用双缓冲，来避免屏幕闪烁，提升渲染的流畅度
 * 更新面板的刷新频率为每秒60帧
 * 优化我方坦克的移动和射击代码，用switch代替if-else
 * 更改爆炸效果图片的位置到src文件夹下面
 */
public class TankGame04 extends JFrame {
    //定义面板组件
    MyPanel mp = null;
    private ScheduledExecutorService scheduler;
    static Scanner scanner =  new Scanner(System.in);
    public static void main(String[] args) {
        //SwingUtilities.invokeLater(() -> new TankGame04());可以确保
        // TankGame04 的创建和显示在事件调度线程上进行，这样可以避免线程安全问题和UI线程的阻塞
        SwingUtilities.invokeLater(() -> new TankGame04());
        //SwingUtilities.invokeLater():是一个 Swing 的工具类方法，用来将任务提交到事件调度线程。
        //事件调度线程负责处理 Swing 组件的事件和更新界面的线程
        //() -> new TankGame04():是一个 Lambda 表达式，它定义了一个无参数的方法，方法体是 new TankGame04()。
        // 这个 Lambda 表达式会被传递给 SwingUtilities.invokeLater 方法，
        // 表示在事件调度线程上执行 new TankGame04() 这一操作

        //无需再执行TankGame04 tankGame04 = new TankGame04();

    }

    public TankGame04() {
        // 创建调度线程池
        scheduler = Executors.newScheduledThreadPool(1);
        System.out.println("请输入你的选择 1:继续上局的游戏 / 2:开始新的游戏");
        String key = scanner.next();
        while (!(key.equals("1")||key.equals("2"))){
            System.out.println("输入有误！请输入你的选择 1:继续上局的游戏 / 2:开始新的游戏");
            key = scanner.next();
        }
        //初始化面板
        mp = new MyPanel(key);
        //将面版 mp 放入到Thread，并启动
        Thread thread = new Thread(mp);
        thread.start();
        //把面板放入到窗口中
        this.setTitle("坦克大战");
        this.add(mp);
        this.setSize(1600, 1000);
        this.addKeyListener(mp);//让JFrame 监听mp的键盘事件
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);////当关闭窗口时，程序完全退出
        this.setVisible(true);//将this指代的对象设定为可见
        // 启动游戏开始背景音乐
        new PlayWave("src/bgm/TankGameStartBgm.wav", false).start();
        // 在游戏开始后5秒启动主背景音乐
        scheduler.schedule(() -> {
            new PlayWave("src/bgm/TankGameBgm.wav", true).start();
        }, 5, TimeUnit.SECONDS);

        //在 JFrame 中增加关闭窗口时进行的处理
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                Recorder.keepRecord();
                System.exit(0);//程序正常执行结束后退出
            }
        });

    }

}
